#include <iostream>
#include <cstring>
using namespace std;

const int N = 13000; //货物的种类乘以货物可以分成的块数，计算公式为1010 * (log2(2000) + 1)=12085

int n, m;
int v, w, s;             //这里不用开数组存,因为存一个以后都要作为唯一的货物丢在下面的数组里面的
int V[N], W[N], cnt = 0; //存储封装好的货物的属性，cnt存储已经封装好的数量，可以认为是01背包问题中的n
int f[N];                //状态表示方程

int main()
{
    freopen("cin.txt", "r", stdin);
    memset(f, 0, sizeof f);
    cin >> n >> m;
    for (int i = 1; i <= n; ++i) //一个输入并且封装的过程
    {
        cin >> v >> w >> s;
        int k = 1;    //当前要封装的块数
        while (s > k) //只要剩余的数量还允许被封装
        {
            V[++cnt] = v * k;
            W[cnt] = w * k;
            s -= k;
            k *= 2;
        }
        if (s) //剩下的s就是我们说的C了
        {
            V[++cnt] = v * s;
            W[cnt] = w * s;
        }
    }
    //封装好以后按照完全背包问题的思路去解决即可
    for (int i = 1; i <= cnt; ++i)
        for (int j = m; j >= V[i]; --j) //这里因为是上层迭代本层，所以要倒着
            f[j] = max(f[j], f[j - V[i]] + W[i]);
    cout << f[m];
    return 0;
}